今天終於進入 ES6 的範圍了(灑花~~ 最近想不到有甚麼好寫的,就乾脆來照清單寫好了。
let 和 const 兩個東西也出現好幾年了... 現在才要來講好像太晚了,所以除了教學之外順便講講可能會忽略的小細節。
let 的用法基本上與 var 沒有差別,都可以用來宣告變數。
不過 let 不會受到 Hoisting 的影響。忘記 Hoisting 的可以去看這篇 Day22. Hoisting 的觀念。
console.log(isA); // undefined
var isA = 'a';
console.log(isB); // isB is not defined
let isB = 'b';
所以請記得在一開始就先把變數宣告好。這也是個好習慣就是了~~
另外,使用 var 的話會汙染到全域變數,而 let 只會在自己的作用域中有效,就是離自己最近的大括號中{},等等要介紹的 const 也一樣。
var isA = 'A';
if(isA){
var red = 'red';
}
console.log(red); // red
let isA = 'A';
if(isA){
let red = 'red';
}
console.log(red); // red is not defined
因為只在自己作用域中有效,所以下述範例中的 else 也無效。
let isA;
if(isA){
let red = 'red';
}
else{
console.log('else');
console.log(red); // red is not defined
}
console.log(red);
迴圈內的話,因為 let 可以被重新賦值因此可以執行
let count1 = [];
for(let i = 0; i < 10; i++){
count1.push(function(){
console.log(i);
})
}
count1.forEach(function(item){
item(); // 0~9
});
let 也禁止重複宣告
var isA = 'A';
var isA = 'a';
console.log(isA); // a
let isA = 'A';
let isA = 'a';
console.log(isA); // Identifier 'isA' has already been declared
const 全名是 constant(不變),顧名思義,宣告後就無法再改變的變數。
const num = 5;
num = 6;
console.log(num); // Uncaught TypeError: Assignment to constant variable.
還記得我在執行環境與作用域中講到"任何變數在未賦予值之前都是 undefined
"嗎? 忘記的可以再去看看 Day21. JavaScript 的執行環境與作用域
因為 undefined
是一個值,所以在 const 宣告後沒有直接賦予值,那之後就不能再改了!!(而且他也不會給你宣告
const 也只能在自己的作用域中使用。
const TRue = true;
if(TRue){
const isA = 'A';
}
console.log(isA); // isA is not defined
迴圈內的話,因為執行了 i++,const 被重新賦值而會出現錯誤。
var count2 = [];
for(const i = 0; i < 10; i++){
count2.push(function(){
console.log(i);
})
}
另外,const 雖然禁止自己修改資訊,但是允許自己底下的其他值修改
const JK = {
name: 'Yukinoshita Yukino',
}
JK.name = 'Yuigahama Yui';
console.log(JK.name);
直接修改自己本身的話會出錯
const JK = {
name: 'Yukinoshita Yukino',
}
JK = {
name: 'Yuigahama Yui',
};
console.log(JK.name); // Uncaught TypeError: Assignment to constant variable.
最後,有些人在使用命名 const 的變數時會建議使用大寫,這樣可以清楚地與 let 宣告做出區別。
就個人來說從 var 改成 let、const 非常舒服,在使用上 let 感覺就像 var 的完全體...
那今天 ES6 最初的教學就到這邊喽~~ 明天見~~